package com.wisezone.demo0304;

import org.apache.commons.dbutils.ResultSetHandler;

import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class My<T> implements ResultSetHandler<List<T>> {
    @Override
    public List<T> handle(ResultSet resultSet) throws SQLException {
        T t=null;
        List<T> list= null;
        if(resultSet!=null)
        {

            String colName=null;
            Object value=null;
            ResultSetMetaData rsmd= resultSet.getMetaData();
            int count =rsmd.getColumnCount();
            String packName="com.wisezone.demo0304";
            String tableName=rsmd.getTableName(4);
            try {
                Class<?> tClass=Class.forName(packName+"."+captureName(tableName));
                Field field=null;
                list=new ArrayList<>();
                while (resultSet.next()){
                    t=(T)tClass.newInstance();
                    for(int i=1;i<=count;i++){
                        // 数据表的列名
                        colName=rsmd.getColumnLabel(i);
                        //根据类名，取得列对应的记录值
                        value=resultSet.getObject(colName);
                        //通过反射取得属性对象
                        field=tClass.getDeclaredField(colName);
                        //授权属性权限
                        field.setAccessible(true);
                        //通过反射给实体对象属性赋值
                        field.set(t,value);
                    }
                    list.add(t);
                }

            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            }catch (NoSuchFieldException e){
                e.printStackTrace();
            }catch (SecurityException e){
                e.printStackTrace();
            }

        }
        return list;
    }

    /**
     * 字符串首字母大写
     * @param str
     * @return
     */
    private static String captureName(String str) {
        // 进行字母的ascii编码前移，效率要高于截取字符串进行转换的操作
        char[] cs=str.toCharArray();
        cs[0]-=32;
        return String.valueOf(cs);
    }
}
